package br.com.ds3.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.ds3.model.Evento;
import br.com.ds3.model.Inscricao;
import br.com.ds3.model.Usuario;

@Component
public class InscricaoDAO extends GenericDAO<Inscricao> {
	private final Long TAMANHO = new Long(10);

	@Override
	public Class<Inscricao> getModelClass() {
		return Inscricao.class;
	}
	
	private Criteria createCriteriaPesquisa(Usuario participante, Evento evento, boolean somenteNovos) {
		Criteria criteria = getSession().createCriteria(getModelClass());
		criteria.createAlias("evento", "e");
		criteria.createAlias("atividade", "a");
		criteria.createAlias("participante", "p");
		
    	if (somenteNovos) {    		
    		criteria.add(Restrictions.ge("a.data", new Date()));
    	}
		
		if (participante != null) {
			criteria.add(Restrictions.eq("p.id", participante.getId()));
		}
		
		if (evento != null) {
			criteria.add(Restrictions.eq("e.id", evento.getId()));
		}
		
		return criteria;
	}
	
	public List<Inscricao> pesquisa(Usuario participante, Evento evento, boolean somenteNovos, Long pagina, Order...orders) {
		Criteria criteria = createCriteriaPesquisa(participante, evento, somenteNovos);
		
		for (Order order : orders) {
			criteria.addOrder(order);
		}
				
		return executaCriteria(criteria, pagina, TAMANHO);
	}
	
	@SuppressWarnings("unchecked")
	public List<Inscricao> pesquisaCompleta(Long idParticipante, Long idEvento, Long idAtividade)
	{
		Criteria criteria = getSession().createCriteria(getModelClass());
		
		if(idEvento != null) criteria.add(Restrictions.eq("evento.id", idEvento));
		
		if(idParticipante != null) criteria.add(Restrictions.eq("participante.id", idParticipante));
		
		if(idAtividade != null) criteria.add(Restrictions.eq("atividade.id", idAtividade));	
		
		return criteria.list();
	}
		
	public Long getNumeroInscricoes( Long idEvento, Long idAtividade)
	{
		Criteria criteria = getSession().createCriteria(getModelClass());
		if(idEvento != null) criteria.add(Restrictions.eq("evento.id", idEvento));
		if(idAtividade != null)	criteria.add(Restrictions.eq("atividade.id", idAtividade));	
		return countCriteria(criteria);
	}
	
    public Long countPaginas(Usuario participante, Evento evento, boolean somenteNovos) {
    	Criteria criteria = createCriteriaPesquisa(participante, evento, somenteNovos);

    	Long quantidadeRegistros = countCriteria(criteria);
    	
    	Long paginas = countPaginas(quantidadeRegistros, TAMANHO);
    	
    	return paginas;
    }
}
